参考文章:https://www.callicoder.com/distributed-unique-id-sequence-number-generator/
已有解决方案
UUID
UUID是全局唯一的128位十六进制数字。 两次生成相同UUID的可能性可以忽略不计。
UUID的问题在于它们的大小非常大并且索引不好。 当您的数据集增加时,索引大小也会增加,并且查询性能会受到影响。
MongoDB的ObjectId
MongoDB的ObjectID是12字节(96位)十六进制数字,由 - 组成 -
一个4字节的纪元时间戳,以秒为单位,
一个3字节的机器标识符,
一个2字节的进程ID,和
一个3字节的计数器,以随机值开始。
这比早期的128位UUID小。但同样,大小比我们通常在单个MySQL自动增量字段(64位bigint值)中的长度要长。
Database Ticket Servers
此方法使用集中式数据库服务器生成唯一的递增ID。 这就像一个集中的自动增量。 Flickr使用此方法。
这种方法的问题是票证服务器可能成为写入瓶颈。 此外,您还需要在基础架构中引入一个需要管理和扩展的组件。
Twitter Snowflake
Twitter Snowflake是一种专用网络服务,用于大规模生成64位唯一ID。 此服务生成的ID大致可按时间排序。
ID由以下组件组成:
Epoch时间戳以毫秒为单位精度 - 41位(使用自定义纪元为69年)
配置的机器ID - 10位(最多可提供1024台机器)
序列号 - 12位(每台机器的本地计数器,每4096重复一次)
为了后续扩展,他们保留了1位。 由于ID使用时间戳作为第一个组件,因此它们是可排序的。
Twitter Snowflake 生成的ID符合64位,并且是时间可排序的, 这就是我们想要的。但如果我们使用Twitter Snowflake,我们将再次在我们需要维护的基础架构中引入另一个组件。
Distributed 64-bit unique ID generator inspired by Twitter Snowflake
该序列生成器生成的ID由 - 组成;
Epoch时间戳以毫秒为单位精度 - 42位。 可以使用42位表示的最大时间戳是2^42-1,或4398046511103,其发布时间是2109年5月15日星期三7:35:11.103 AM。 可以使用139年的定制时代。
节点ID - 10位。 这为我们提供了1024个节点/机器。
每台机器的本地计数器 - 12位。 计数器的最大值为4095。
您的微服务可以使用此序列生成器独立生成ID。 这是有效的,适合bigint的大小。
java版本代码
1 |
|
go版本代码
1 | package main |
参考文章
https://github.com/twitter-archive/snowflake/tree/snowflake-2010
https://en.wikipedia.org/wiki/Universally_unique_identifier
https://docs.mongodb.com/manual/reference/method/ObjectId/
http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/
https://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c
https://stackoverflow.com/questions/2671858/distributed-sequence-number-generation/5685869